package com.chaopei.list;

//数据结构:准备数据,定义顺序表结构
public class SLType {
	// 设置数组元素最大长度
	static final int MAXLEN = 100;
	// 保存顺序表的结构数组,此处为什么加1?
	DATA[] ListData = new DATA[MAXLEN + 1];
	int ListLen;// 顺序表已存结点的数量

	// 初始化顺序表
	void SLInit(SLType SL) {
		SL.ListLen = 0;// 初始化为空表
	}

	// 返回顺序表的元素数量
	int SLLength(SLType SL) {
		return SL.ListLen;
	}

	// 执行添加操作
	int SLInsert(SLType SL, int n, DATA data) {
		int i;
		// 已满不让插入
		if (SL.ListLen >= MAXLEN) {
			System.out.println("顺序表已满,不能插入结点\n");
			return 0;
		}
		// 插入位置不对,为什么不能为0;此处执行的是插入到中间,在尾部的添加有专门操作
		if (n < 1 || n > SL.ListLen - 1) {
			System.out.println("插入序号不正确,不能插入元素\n");
			return 0;
		}
		// 将元素插入到指定位置
		for (i = SL.ListLen; i >= n; i--) {
			SL.ListData[i + 1] = SL.ListData[i];
		}
		SL.ListData[n] = data;
		SL.ListLen++;
		return 1;
	}// insert

	// 添加到末尾
	int SLAdd(SLType SL, DATA data) {
		if (SL.ListLen >= MAXLEN) {
			System.out.println("顺序表已满,不能再添结点\n");
			return 0;
		}
		SL.ListData[++SL.ListLen] = data;
		return 1;
	}

	// 按元素序号删除顺序表中的结点
	int SLDelete(SLType SL, int n) {
		int i;
		if (n < 1 || n > SL.ListLen + 1) {//可以是n<0
			System.out.println("删除结点的序号错误,不能删除结点\n");
			return 0;
		}
		for (i = n; i < SL.ListLen; i++) {
			SL.ListData[i] = SL.ListData[i + 1];
		}
		SL.ListLen--;
		return 1;
	}

	// 根据序号返回数据元素
	DATA SLFindByNum(SLType SL, int n) {
		if (n < 1 || n > SL.ListLen + 1) {// 为什么是加1
			System.out.println("结点序号错误,找不到结点\n");
			return null;
		}
		return SL.ListData[n];
	}// find

	// 按关键点查找结点所在的序号
	int SLFindByKey(SLType SL, String key) {
		int i;//i不能是0
		for (i = 1; i <= SL.ListLen; i++) {//为什么不是0
			if (SL.ListData[i].key.compareTo(key) == 0) {
				return i;
			}
		} // for
		return 0;
	}// findByKey

	// 显示顺序表中的所有结点并返回状态码0,结止程序
	int SLAll(SLType SL) {
		int i;
		// 此处为什么是1不是0
		for (i = 1; i <= SL.ListLen; i++) {
			System.out.printf("%s,%s,%d", SL.ListData[i].key, SL.ListData[i].name, SL.ListData[i].age);
			System.out.println();
		} // for
		return 0;
	}// slall
}
